package net.zjitc.servlet.cookiesession;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author Administrator
 * @Date 2020/6/2 16:14
 * 访问一个Servlet，若果是第一次访问，
 * 则提示：您好，欢迎您首次访问、
 * 2、如果不是第一次访问，
 * 则提示：欢迎回来，您上次访问时间为：显示时间字符串
 **/
@WebServlet("/visitTime")
public class VisitTime extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
       判断是第一次访问还是不是第一次访问？
       1、获取所有cookie（数组）
       2、循环遍历改cookie数组
         判断cookie的key/name是否是"lastTime"
         若是，则表示不是第一次访问：
           1）把cookie的该key对应的value值取出来
           2）输出提示信息：欢迎回来，上次访问时间是：value
           3)把当前时间加到cookie（若key值相同，value会覆盖）
         3、若遍历完后都没有
         表示第一次访问
         1）输出提示cincinnati：欢迎首次访问
         2）把当前时间加到cookie（key定义为lastTime）
         */
        /*设置响应编码*/
        resp.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = req.getCookies();
        /*表示首次访问*/
        boolean flag = false;
        if (cookies !=null && cookies.length>0){
            for (Cookie c:cookies) {
                String name = c.getName();
                if (name.equals("lastTime")){
                    /*不是第一次访问*/
                    String value = c.getValue();
                    /*对value做解码*/
                    value = URLDecoder.decode(value, "utf-8");

                    resp.getWriter().write( "欢迎回来，上次访问时间是："+ value);
                    Date date= new Date();
                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    String d= sdf.format(date);
                    String s = URLEncoder.encode(d,"utf-8");

                    /*当前时间有特殊字符，会乱码，需要处理，先用字符串表示一下*/
                    c.setValue(s);
                    c.setMaxAge(24*60*60);
                    resp.addCookie(c);
                    /*表示不是第一次访问*/
                    flag=true;
                    /*若已经找到相同的，就没有必要再继续循环了，跳出循环*/
                    break;
                }
            }
        }
        /*首次访问：cookie是空或flag是false*/
        if (cookies == null || cookies.length==0 || flag==false ){
            /*输出提示信息：欢迎首次访问*/
            /*把当前时间添加到cookie*/
            resp.getWriter().write("欢迎首次访问");
            Date date = new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String format = sdf.format(date);
            /*日期时间中有特殊字符，存在cookie需要处理*/
            /*存的时候先编码，取的时候再解码*/
           String s= URLEncoder.encode(format,"utf-8");

            Cookie cookie = new Cookie("lastTime",s);
            cookie.setMaxAge(60*60*60);
            resp.addCookie(cookie);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

}
